//给定一个排序数组和一个目标值，在数组中找到目标值，并返回其索引。如果目标值不存在于数组中，返回它将会被按顺序插入的位置。 
//
// 你可以假设数组中无重复元素。 
//
// 示例 1: 
//
// 输入: [1,3,5,6], 5
//输出: 2
// 
//
// 示例 2: 
//
// 输入: [1,3,5,6], 2
//输出: 1
// 
//
// 示例 3: 
//
// 输入: [1,3,5,6], 7
//输出: 4
// 
//
// 示例 4: 
//
// 输入: [1,3,5,6], 0
//输出: 0
// 
// Related Topics 数组 二分查找 
// 👍 574 👎 0

package leetcode.editor.cn;
//Java：搜索插入位置
public class P35SearchInsertPosition{
    public static void main(String[] args) {
        Solution solution = new P35SearchInsertPosition().new Solution();
        // TO TEST
        int nums[]=new int[]{1,3,5,6};
        int target=3;
        System.out.println(solution.searchInsert(nums,target));
    }
    //leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public int searchInsert(int[] nums, int target) {
        if(nums==null||nums.length<=0){
            return -1;
        }
        int len=nums.length;
        if(target>nums[len-1]){
            return len;
        }

        return searchIndex(nums,0,len-1,target);
    }
    /*
    题目的意思可以转换为对一个大于等于该数字的值
    （1）什么时候返回结果
    - 该数正好等于target
    - 该数大于target但是该数的前一个值小于target
    * */
    public int searchIndex(int[] nums,int begin,int end,int target){
        if(begin>end){
            return -1;
        }
        int mid=begin+((end-begin)>>>1);
        if(nums[mid]==target||(nums[mid]>target&&(mid==0||(mid-1>=0&&nums[mid-1]<target)))){
            return mid;
        }
        if(target<nums[mid]){
           return searchIndex(nums,begin,mid-1,target);
        }else{
           return searchIndex(nums,mid+1,end,target);
        }
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}
